import random
import re

from info import redis_store
from info.models import User
from info.utils.response_code import RET
from info.utils.yuntongxun.sms import CCP
from . import pass_blu
from flask import make_response, request, jsonify, current_app
from info.utils.captcha.captcha import captcha


@pass_blu.route("/image_code")
def image_code():
    """返回图片验证"""
    # 1,获取uuid
    image_code_id = request.args.get("image_code_id")
    if not image_code_id:
        return jsonify(errno=RET.PARAMERR, errmsg="缺少参数")

    # 2,生成图片内容
    # 第一个是图片的名称，第二个是验证码文本，第三个是验证码图片的内容
    name, text, content = captcha.generate_captcha()

    # 3,保存图片文本内容和uuid 到redis中
    try:
        redis_store.set("image_code_id:" + image_code_id, text, 300)
    except Exception as e:
        current_app.logger.errno(e)
        return jsonify(errno=RET.DBERR, errmsg="保存图片验证码失败")

    # 4返回图片内容
    response = make_response(content)
    response.headers["Content-Type"] = "image/jpg"

    return response


@pass_blu.route("/sms_code", methods=["POST"])
def sms_code():
    """短信验证"""
    print("+++++")
    # 1，获取参数
    data_dict = request.json  # 获取并转为字典
    # 1.1, 获取参数
    # 手机号mobile
    mobile = data_dict.get("mobile")


    # 客户输入的图片验证内容
    image_code = data_dict.get("image_code")
    # uuid即image_code_id
    image_code_id = data_dict.get("image_code_id")


    # 1.2, 判空, 校验(比如手机格式)
    if not all([mobile, image_code, image_code_id]):

        return jsonify(errno=RET.PARAMERR, errmsg="缺少参数")

    # 验证手机格式
    if not re.match(r"^1[35678]\d{9}$", mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机格式错误")
    print(mobile)

    # 2，验证用户输入的图片验证码(对比用户输入的图片验证码和真实的图片验证码)
    # 2.1, 从redis中获取真实的图片验证码(通过uuid键来获取)

    try:
        red_image_code = redis_store.get("image_code_id:" + image_code_id)
    except Exception as e:
        current_app.logger.errno(e)
        return jsonify(errno=RET.DBERR, errmsg="获取图片验证失败")

    # 2.2, 判断用户输入的图片验证码和真实的图片验证码是否一致, 如果不一致, 就return
    # 如果查询到的是空的说明图片过期
    if not red_image_code:
        return jsonify(errno=RET.NODATA, errmsg="图片已过期")

    # 验证用户输入的验证码是否正确
    if image_code.lower() != red_image_code.decode().lower():
        return jsonify(errno=RET.DATAERR, errmsg="验证失败")

    # 3，发送短信验证码
    # 3.1
    # 查询数据库, 看手机是否已经存在, 如果已经存在, 就return

    user = User.query.filter(User.mobile == mobile).first()
    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg="手机号已经存在")
    print(mobile)

    # 3.2
    # 发送短信验证码

    ra_num = random.randint(0, 999999)
    ra_num = "%6d" % ra_num
    # ccp = CCP()
    # ret = ccp.send_template_sms(mobile, [ra_num, 5], 1)
    # if ret != 0:
    #     return jsonify(errno=RET.NODATA, errmsg="发送短信失败")
    # 3.3
    # 保存真是的短信验证码到redis中(以便后面注册函数中对比校验用户输入的短信验证码是否正确, 键名为手机号)
    try:
        redis_store.set("user_mobile:" + mobile, ra_num)
    except Exception as e:
        current_app.logger.errno(e)
        return jsonify(errno=RET.DBERR, errmsg="保存短信验证码失败")
    # 3.4
    # 返回操作成功

    return jsonify(errno=RET.OK, errmsg="短信发送成功")
